package persistencia;

import gamebook.UsuarioGenerico;
import gamebook.Evento;
import gamebook.EventoAsistencia;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.*;
import java.sql.SQLException;

public class PEvento {

    public static boolean nuevoEvento(Evento evento) throws SQLException {
        boolean resultado = true;         //false = Problema en la inserción
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;

        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

        try {
            //Conexión con la base de datos
            connection = Persistencia_Conexion.getConnection();
            statement = connection.createStatement();

            //tratamiento para fecha del evento
            Date dateFecha = evento.getFecha();
            String stringFecha = dateFormat.format(dateFecha);

            boolean tipo = true;

            String query = "insert into eventos ("
                    + "eve_tit,"
                    + "eve_des,"
                    + "eve_fec,"
                    + "eve_dir,"
                    + "eve_usu_id) values ("
                    + "'" + evento.getTitulo() + "',"
                    + "'" + evento.getDescripcion() + "',"
                    + "'" + stringFecha + "',"
                    + "'" + evento.getDireccion() + "',"
                    + evento.getUsuario().getId()
                    + ")";

            int registros = statement.executeUpdate(query);

            if (registros == 1) {
                //Si hemos introducido el nuevo mensaje, le asignamos el ID con el que se guardó en la base de datos
                resultSet = statement.executeQuery("select max(eve_id) as eve_id from eventos");
                if (resultSet.next()) {
                    evento.setId(resultSet.getInt("eve_id"));
                }
            } else {
                resultado = false;
            }
        } catch (Exception ex) {
        } finally {
            //Cerramos todo y salimos
            try {
                resultSet.close();
                statement.close();
                connection.close();
            } catch (Exception ex) {
            }
        }

        return resultado;
    }

    public static boolean actualizaEvento(Evento evento) throws SQLException {
        boolean resultado = true;         //false = Problema en la inserción
        Connection connection = null;
        Statement statement = null;

        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

        try {
            //Conexión con la base de datos
            connection = Persistencia_Conexion.getConnection();
            statement = connection.createStatement();

            //tratamiento para fecha del evento
            Date dateFecha = evento.getFecha();
            String stringFecha = dateFormat.format(dateFecha);

            String query = "update eventos set "
                    + "eve_tit = '" + evento.getTitulo() + "',"
                    + "eve_des = '" + evento.getDescripcion() + "',"
                    + "eve_fec = '" + stringFecha + "',"
                    + "eve_dir = '" + evento.getDireccion() + "',"
                    + "eve_usu_id = " + evento.getUsuario().getId()
                    + " where eve_id = " + evento.getId();

            int registros = statement.executeUpdate(query);

            if (registros != 1) {
                resultado = false;
            }

        } catch (Exception ex) {
        } finally {
            //Cerramos todo y salimos
            try {
                statement.close();
                connection.close();
            } catch (Exception ex) {
            }
        }

        return resultado;
    }

    public static int cuentaEventos(UsuarioGenerico usuario) throws SQLException {
        //Lista que se devolverá
        int cuenta = 0;
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;

        try {
            //Conexión con la base de datos
            connection = Persistencia_Conexion.getConnection();
            statement = connection.createStatement();

//Vamos a unir Dos SELECT, este es el primero
            //Obtiene eventos exclusivamente de contactos PRIMERO CON USUARIO COMO ANFITRION
            String query = "SELECT eventos.eve_id, eventos.eve_tit, eventos.eve_des,"
                    + " eventos.eve_fec, eventos.eve_usu_id, usuarios.id, usuarios.nombre,"
                    + " usuarios.apellidos, usuarios.mail, usuarios.nacimiento, usuarios.sexo,"
                    + " usuarios.password, usuarios.localidad, usuarios.tipo, usuarios.activo"
                    + " FROM eventos"
                    + " LEFT OUTER JOIN usuarios ON (eventos.eve_usu_id = usuarios.id)"
                    + " LEFT OUTER JOIN amistades ON (usuarios.id = amistades.id_invitado)"
                    + " WHERE eventos.eve_fec >= now() "
                    + " AND amistades.id_anfitrion = " + usuario.getId() + ""
                    + " AND amistades.confirmado = 1"
                    + " OR usuarios.id = " + usuario.getId() + ""
                    + " OR usuarios.tipo = 2"
                    + " OR usuarios.tipo = 3";
//Unimos Dos SELECT siempre que los registros sean distintos (Sin duplicados) y ordenamos al final por fecha
            query += " UNION DISTINCT ";
            //Obtiene eventos exclusivamente de contactos AHORA CON USUARIO COMO INVITADO
            //[esta vez no incluimos a los administradores, ni asociados, ni los propios]
            query += "SELECT eventos.eve_id, eventos.eve_tit, eventos.eve_des,"
                    + " eventos.eve_fec, eventos.eve_usu_id, usuarios.id, usuarios.nombre,"
                    + " usuarios.apellidos, usuarios.mail, usuarios.nacimiento, usuarios.sexo,"
                    + " usuarios.password, usuarios.localidad, usuarios.tipo, usuarios.activo"
                    + " FROM eventos"
                    + " LEFT OUTER JOIN usuarios ON (eventos.eve_usu_id = usuarios.id)"
                    + " LEFT OUTER JOIN amistades ON (usuarios.id = amistades.id_invitado)"
                    + " WHERE eventos.eve_fec >= now() "
                    + " AND amistades.id_invitado = " + usuario.getId() + ""
                    + " AND amistades.confirmado = 1";

            resultSet = statement.executeQuery(query);

            //Contamos los registros obtenidos
            cuenta=0;
            while (resultSet.next()) {
                cuenta ++;
            }

        } catch (Exception ex) {
        } finally {
            //Cerramos todo y salimos
            try {
                resultSet.close();
                statement.close();
                connection.close();
            } catch (Exception ex) {
            }
        }

        return cuenta;
    }

    public static List<Evento> selectEventos(UsuarioGenerico usuario, int inicio, int fin) throws SQLException {
        //Lista que se devolverá
        List<Evento> listEvento = new ArrayList();
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;

        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

        try {
            //Conexión con la base de datos
            connection = Persistencia_Conexion.getConnection();
            statement = connection.createStatement();

//Vamos a unir Dos SELECT, este es el primero
            //Obtiene eventos exclusivamente de contactos PRIMERO CON USUARIO COMO ANFITRION
            String query = "SELECT eventos.eve_id, eventos.eve_tit, eventos.eve_des,"
                    + " eventos.eve_fec, eventos.eve_usu_id, eventos.eve_dir, usuarios.id, usuarios.nombre,"
                    + " usuarios.apellidos, usuarios.mail, usuarios.nacimiento, usuarios.sexo,"
                    + " usuarios.password, usuarios.localidad, usuarios.tipo, usuarios.activo"
                    + " FROM eventos"
                    + " LEFT OUTER JOIN usuarios ON (eventos.eve_usu_id = usuarios.id)"
                    + " LEFT OUTER JOIN amistades ON (usuarios.id = amistades.id_invitado)"                    
                    + " WHERE eventos.eve_fec >= now() "
                    + " AND amistades.id_anfitrion = " + usuario.getId() + ""
                    + " AND amistades.confirmado = 1"
                    + " OR usuarios.id = " + usuario.getId() + ""
                    + " OR usuarios.tipo = 2"
                    + " OR usuarios.tipo = 3";
//Unimos Dos SELECT siempre que los registros sean distintos (Sin duplicados) y ordenamos al final por fecha
            query += " UNION DISTINCT ";
            //Obtiene eventos exclusivamente de contactos AHORA CON USUARIO COMO INVITADO
            //[esta vez no incluimos a los administradores, ni asociados, ni los propios]
            query += "SELECT eventos.eve_id, eventos.eve_tit, eventos.eve_des,"
                    + " eventos.eve_fec, eventos.eve_usu_id, eventos.eve_dir, usuarios.id, usuarios.nombre,"
                    + " usuarios.apellidos, usuarios.mail, usuarios.nacimiento, usuarios.sexo,"
                    + " usuarios.password, usuarios.localidad, usuarios.tipo, usuarios.activo"
                    + " FROM eventos"
                    + " LEFT OUTER JOIN usuarios ON (eventos.eve_usu_id = usuarios.id)"
                    + " LEFT OUTER JOIN amistades ON (usuarios.id = amistades.id_invitado)"
                    + " WHERE eventos.eve_fec >= now() "
                    + " AND amistades.id_invitado = " + usuario.getId() + ""
                    + " AND amistades.confirmado = 1"
                    //Finalmente ordenamos por fecha
                    + " ORDER BY eve_fec, eve_id"
                    //Y el limit para la paginación
                    + " limit "+inicio+","+fin;

            resultSet = statement.executeQuery(query);

            while (resultSet.next()) {
                Evento e = new Evento(resultSet.getInt("eve_id"), resultSet.getString("eve_tit"),
                        resultSet.getString("eve_des"), resultSet.getDate("eve_fec"), usuario, resultSet.getString("eve_dir"));

                listEvento.add(e);
            }

        } catch (Exception ex) {
        } finally {
            //Cerramos todo y salimos
            try {
                resultSet.close();
                statement.close();
                connection.close();
            } catch (Exception ex) {
            }
        }

        return listEvento;
    }

    public static Evento selectEventoId(int pId) throws SQLException {
        //Lista que se devolveráEvento evento = new Event      
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;
        UsuarioGenerico usuario = null;
        List<Evento> evento = new ArrayList();

        try {
            //Conexión con la base de datos
            connection = Persistencia_Conexion.getConnection();
            statement = connection.createStatement();

            //Obtiene eventos exclusivamente de contactos
            String query = "SELECT eventos.eve_id, eventos.eve_tit, eventos.eve_des,"
                    + " eventos.eve_fec, eventos.eve_usu_id, eventos.eve_dir"
                    + " FROM eventos"
                    + " WHERE eventos.eve_id = " + pId + "";

            resultSet = statement.executeQuery(query);

            while (resultSet.next()) {
                usuario = UsuarioGenerico.getUsuarioPorId(resultSet.getInt("eve_usu_id"));
                Evento e = new Evento(resultSet.getInt("eve_id"), resultSet.getString("eve_tit"),
                        resultSet.getString("eve_des"), resultSet.getDate("eve_fec"), usuario, resultSet.getString("eve_dir"));
                evento.add(e);
            }



        } catch (Exception ex) {
        } finally {
            //Cerramos todo y salimos
            try {
                resultSet.close();
                statement.close();
                connection.close();
            } catch (Exception ex) {
            }
        }

        return evento.get(0);
    }
    
    public static boolean nuevaAsistencia(EventoAsistencia eventoA) throws SQLException {
        boolean resultado = true;         //false = Problema en la inserción
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;

        try {
            //Conexión con la base de datos
            connection = Persistencia_Conexion.getConnection();
            statement = connection.createStatement();
            
            String query = "insert into eventosasistencia ("
                    + "eus_eve_id,"
                    + "eus_usu_id,"
                    + "eus_est) values ("                    
                    + "" + eventoA.getEus_eve_id() + ","
                    + "" + eventoA.getEus_usu_id() + ","
                    + "" + eventoA.getEus_est() + ""
                    + ")";

            int registros = statement.executeUpdate(query);

            if (registros == 1) {
                //Si hemos introducido el nuevo mensaje, le asignamos el ID con el que se guardó en la base de datos
                resultSet = statement.executeQuery("select max(eus_id) as eus_id from eventosasistencia");
                if (resultSet.next()) {
                    eventoA.setEus_id(resultSet.getInt("eus_id"));
                }
            } else {
                resultado = false;
            }
        } catch (Exception ex) {
            resultado=false;
        } finally {
            //Cerramos todo y salimos
            try {
                resultSet.close();
                statement.close();
                connection.close();
            } catch (Exception ex) {
            }
        }

        return resultado;
    }  
    
    public static boolean borraAsistencia(int pId, int pUsuario) throws SQLException {
        boolean resultado = true;         //false = Problema en la inserción
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;

        try {
            //Conexión con la base de datos
            connection = Persistencia_Conexion.getConnection();
            statement = connection.createStatement();
            
            String query = "Delete from eventosasistencia"
                    + " where eus_eve_id = " + pId
                    + " and eus_usu_id = " + pUsuario;

            int registros = statement.executeUpdate(query);

            if (registros == 1) {
                resultado = true;
            } else {
                resultado = false;
            }
        } catch (Exception ex) {
            resultado=false;
        } finally {
            //Cerramos todo y salimos
            try {
                resultSet.close();
                statement.close();
                connection.close();
            } catch (Exception ex) {
            }
        }

        return resultado;
    }  
    
    public static List<EventoAsistencia> selectAsistencias(UsuarioGenerico usuario, Evento evento) throws SQLException {
        //Lista que se devolverá
        List<EventoAsistencia> listAsistencia = new ArrayList();
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;

        try {
            //Conexión con la base de datos
            connection = Persistencia_Conexion.getConnection();
            statement = connection.createStatement();

//Vamos a unir Dos SELECT, este es el primero
            //Obtiene eventos exclusivamente de contactos PRIMERO CON USUARIO COMO ANFITRION
            String query = "SELECT eus_id, eventosasistencia.eus_eve_id,"
                + " eventosasistencia.eus_usu_id, eventosasistencia.eus_est"
                + " FROM eventosasistencia"
                + " Where eventosasistencia.eus_eve_id = " + evento.getId()
                + " And eventosasistencia.eus_usu_id = " + usuario.getId();                
            
            resultSet = statement.executeQuery(query);

            while (resultSet.next()) {
                EventoAsistencia e = new EventoAsistencia(resultSet.getInt("eus_id"), resultSet.getInt("eus_eve_id"),
                        resultSet.getInt("eus_usu_id"), resultSet.getInt("eus_est"));

                listAsistencia.add(e);
            }

        } catch (Exception ex) {
        } finally {
            //Cerramos todo y salimos
            try {
                resultSet.close();
                statement.close();
                connection.close();
            } catch (Exception ex) {
            }
        }

        return listAsistencia;
    }
    
    public static int cuentaAsistencias(int pId) throws SQLException {
        //Lista que se devolverá
        int cuenta = 0;
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;

        try {
            //Conexión con la base de datos
            connection = Persistencia_Conexion.getConnection();
            statement = connection.createStatement();

            //Obtiene eventos exclusivamente de contactos PRIMERO CON USUARIO COMO ANFITRION
            String query = "Select eus_id from eventosasistencia"
                    + " where eus_est=1 and eus_eve_id = " + pId;               

            resultSet = statement.executeQuery(query);

            //Contamos los registros obtenidos
            cuenta=0;
            while (resultSet.next()) {
                cuenta ++;
            }

        } catch (Exception ex) {
        } finally {
            //Cerramos todo y salimos
            try {
                resultSet.close();
                statement.close();
                connection.close();
            } catch (Exception ex) {
            }
        }

        return cuenta;
    }
    
    
    
    
}
